上一篇我們的錯誤
javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我們的Java應用程式在與591伺服器進行 HTTPS 通訊時,出現錯誤。
unable to find valid certification path to requested target
意思就是Java的信任庫中沒有591的憑證的意思。
那要解決這問題只要把591的憑證導入Java的信任庫就好。
我這邊就不說明HTTPS憑證、公私鑰、CA、crt、keytool是甚麼了。
有興趣可能自己去問GPT了。
不過只要跟著我做,即使不知道在幹嘛,還是可以解決問題的。
首先我們先去591,取得591的crt檔案。
儲存
接下來 使用系統管理員打開CMD執行指令,使用java的keytool將591的crt加入Java的信任庫中。
"C:\Program Files\Java\jdk-17\bin\keytool" -import -alias 591cert -keystore "C:\Program Files\Java\jdk-17\lib\security\cacerts" -file "C:\Users\a3636\Documents\鐵人賽\Day06\_.591.com.tw.crt" -storepass changeit
各參數說明
如果沒用系統管理員:
驗證伺服器身分:當 Java 應用程式透過 HTTPS 存取伺服器時,伺服器會傳送一個 SSL 憑證給客戶端(即你的 Java 應用程式)。 Java 會透過本地的信任庫(cacerts 檔案)來檢查這個憑證是否可信。如果該憑證不在信任庫中,Java 會拒絕建立連接,並拋出 SSL 相關的例外。
提高安全性:將憑證匯入到信任庫可以確保只有被信任的伺服器才能與 Java 應用程式通訊。這樣可以有效防止中間人攻擊,因為只有持有可信任憑證的伺服器才會被接受。
自簽名憑證和內部服務:有時候,你的應用程式可能需要與使用自簽名憑證或內部憑證的伺服器通訊。這些憑證通常不會被公開的憑證授權單位(CA)簽署,因此預設不會被 Java 信任。為了讓 Java 能夠與這些伺服器建立連接,你需要手動將這些憑證匯入到 Java 的信任庫中。
沒有比較沒有傷害,Java現在真的是學習難度比較高的語言。
Python 的請求庫(如 requests)在處理 HTTPS 連接時,預設會使用系統的根憑證存儲,這意味著它可以自動信任系統中的憑證。
Python 還允許透過簡單的參數配置(如 verify=False)來繞過 SSL 驗證。
雖然也有些缺點,但是可以讓新手簡單開始寫程式。
不需要優先搞懂SSL、HTTPS、公私鑰等的相關知識。
可以看到已經沒有錯誤訊息了,並且我把Html的資訊印出來了。
其實只要透過Jsoup就可以快速地拿到Html的內容。
核心程式碼就三行
String urlString = "https://rent.591.com.tw/list?other=newPost&sort=posttime_desc";
Document doc = Jsoup.connect(urlString).get();
log.info("doc is : {}", doc);
其實今天只解決了SSL的問題,還沒有處理動態網頁的問題,明天繼續。